#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
//单人模式
const int Block_Size=25;//方块大小
const int Row=20;//行数
const int Col=12;//列数
const int Area_Out=25;//计分板等边距

enum Direction{
    UP,
    DOWN,
    LEFT,
    RIGHT,
    SPACE
};
//方向操控器件

struct Border{
    int up_bound;
    int down_bound;
    int left_bound;
    int right_bound;
};
//边界信息

struct Block_Point{
    int x_pos;
    int y_pos;
};
//坐标信息

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    //需要使用的函数流程
    void Init_Game();//初始化
    void Start_Game();//开始
    void Game_Over();//结束

    void Block_Reset();//将方块放入游戏区
    void Block_Move(Direction dir);//方块移动
    void Block_Revolve(int Block_use[4][4]);//对方块进行反转
    void Block_Crate(int Block_use[4][4], int Block_ID);//创建新的方块进入游戏区域
    void Border_Side(int Block_use[4][4],Border &border);//确认下落方块的边界，用于之后的运算
    void Block_Stable(int x, int y);//固定已经落地或者无法移动的方块
    bool If_Crash(int x, int y, Direction);//确认是否会和已经固定的方块碰撞
    bool isOver();//用于确认结束的布尔值
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void paintEvent(QPaintEvent *event) override;//绘制事件
    void timerEvent(QTimerEvent *event) override;//计时事件
    void keyPressEvent(QKeyEvent *event) override;//按键响应事件
    void closeEvent(QCloseEvent*event)override;
signals:
    void close();//自定义关闭信号
private:
    Ui::Widget *ui;

private:
    int Game_Area[Row][Col];//游戏区域
    Block_Point Pos_Block;
    int Now_Block[4][4];
    Border Now_border;
    int Next_Block[4][4];
    bool Is_Stable;//判断是否相撞的布尔值
    int score;//积分器
    int Game_Timer;//内置的游戏计时器和画图计时器
    int Paint_Timer;
    int Down_Time;//方块下落时间
    int Refresh_Time;//游戏刷新时间
    bool is_over = false;//默认是不结束的
};
#endif // WIDGET_H
